package juc.topic;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;



/**
 * 计数累加怎么线程安全，可以怎么实现，100个线程，每个线程累加100次，最终计数器的值是多少
 * 采用累加器
 */
public class AtomicCounterDemo {
    /**
     * 在这个示例中，我们定义了一个 AtomicInteger 类型的静态变量counter作为我们的计数器。
     * incrementCounterHundredTimes方法包含了一个循环，它会使计数器递增100次。
     * 由于AtomicInteger的incrementAndGet方法是线程安全的，所以我们不需要额外的同步措施。
     * 在main方法中，我们创建了一个拥有100个线程的线程池，并提交了100个任务，每个任务都会执行incrementCounterHundredTimes方法。
     * 在所有任务完成后，我们输出最终的计数值。由于每个线程都会将计数器增加100，所以最终的计数值应该是 100 * 100 = 10000
     */
    //累加器
    private static final AtomicInteger counter = new AtomicInteger(0);

    public static void main(String[] args) throws InterruptedException {
        //创建一个固定100个线程的线程池
        ExecutorService pool  = Executors.newFixedThreadPool(100);

        //提交100个任务
        for (int i = 0; i < 100; i++) {
            //提交每一个任务
            pool.submit(() -> {
                for (int j = 0; j < 100; j++) {
                    //累加器累加1次
                    counter.incrementAndGet();
                }
            });
        }
        //关闭线程池
        pool.shutdown();
        //等待获取结果
        if (pool.awaitTermination(100, TimeUnit.SECONDS)) {
            System.out.println("计数器最终结果为：" + counter);
        }else {
            System.out.println("任务还未完成：" + counter);
        }

    }
}

